'use strict';

const db = uniCloud.database();
const userCollection = db.collection('users');
const crypto = require('crypto');

exports.main = async (event, context) => {
	// 参数校验
	const { oldPassword, newPassword, userId } = event;
	
	if (!oldPassword || !newPassword) {
		return {
			code: 1,
			message: '参数不完整'
		};
	}
	
	// 获取当前用户ID - 支持多种方式获取用户ID
	let currentUserId = null;
	
	// 1. 首先从event中获取显式传递的userId
	if (userId) {
		currentUserId = userId;
		console.log('从event.userId获取到用户ID:', currentUserId);
	}
	// 2. 尝试从context中获取USERID (uniCloud标准方式)
	else if (context && context.USERID) {
		currentUserId = context.USERID;
		console.log('从context.USERID获取到用户ID:', currentUserId);
	}
	// 3. 尝试从context.uniIdToken中解析
	else if (context && context.uniIdToken) {
		try {
			// 这里需要解析JWT token，简化处理
			console.log('尝试从context.uniIdToken解析用户ID');
			currentUserId = context.uniIdToken.uid || null;
		} catch (e) {
			console.error('解析uniIdToken失败:', e);
		}
	}
	// 4. 尝试从token获取
	else if (event.uniIdToken) {
		try {
			// 这里需要解析JWT token，简化处理
			console.log('尝试从event.uniIdToken解析用户ID');
			currentUserId = event.uniIdToken.uid || null;
		} catch (e) {
			console.error('解析event.uniIdToken失败:', e);
		}
	}
	
	if (!currentUserId) {
		return {
			code: 2,
			message: '用户未登录或未提供userId'
		};
	}
	
	console.log('最终确定的用户ID:', currentUserId);
	
	try {
		// 查询用户信息
		const userResult = await userCollection.doc(currentUserId).get();
		const user = userResult.data && userResult.data[0];
		
		if (!user) {
			return {
				code: 3,
				message: '用户不存在'
			};
		}
		
		// 校验原密码
		const oldPasswordHash = crypto.createHash('md5').update(oldPassword).digest('hex');
		if (user.password !== oldPasswordHash) {
			return {
				code: 4,
				message: '原密码错误'
			};
		}
		
		// 密码格式校验
		const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,20}$/;
		if (!passwordRegex.test(newPassword)) {
			return {
				code: 5,
				message: '新密码必须为8-20位，包含字母和数字'
			};
		}
		
		// 生成新密码哈希
		const newPasswordHash = crypto.createHash('md5').update(newPassword).digest('hex');
		
		// 更新用户密码
		await userCollection.doc(currentUserId).update({
			password: newPasswordHash,
			update_time: new Date().getTime()
		});
		
		// 记录密码修改日志
		await db.collection('password_change_logs').add({
			user_id: currentUserId,
			ip: context.CLIENTIP || '未知IP',
			operation_time: new Date().getTime(),
			operation_type: 'change_password'
		});
		
		return {
			code: 0,
			message: '密码修改成功'
		};
	} catch (e) {
		console.error('修改密码错误:', e);
		return {
			code: 500,
			message: '服务器错误'
		};
	}
}; 